依賴注入是 FastAPI 的一個簡單好用的功能,可以將路徑操作函數所需要的方法,透過 FastAPI 框架先行執行後提供給路徑操作參數。
依賴注入常用於:
透過依賴注入可以減少重複的程式碼,使程式更好維護。
以下是與依賴注入相同概念的術語:
def hello():
print("depends hello")
return "Hello World"
我們先定義一個 hello 方法,執行此方法時會列印 “depends hello”,讓你們知道這裡是使用依賴注入執行的,然後再回傳一個 “Hello World”。
from fastapi import FastAPI, Depends
app = FastAPI()
@app.get("/test")
def test_depends(test: str = Depends(hello)):
return test
接口的部分在定義輸入的地方使用 fastapi 庫中的 Depends 呼叫 hello 達成使用依賴注入,並將回傳值傳遞給 test 參數。
在API文件中可以看到沒有任何需要傳入的參數,因為我們僅僅定義了一個參數已經使用依賴注入獲取所需值。
呼叫接口後可以看到 cmd 中出現 “depends hello”,便是依賴注入成功執行。
回傳值也成功拿取到注入的”Hello World”。
我們也可以使用依賴注入,事先驗證所需要的資料,例如傳入的 user id 在資料庫中使否有值等等情境。在依賴注入方法中聲明的輸入也會被附加到路徑操作函數中。
from fastapi import FastAPI, status, Depends, HTTPException
from uuid import UUID
fake_data = {
"3fa85f64-5717-4562-b3fc-2c963f66afa6": {
"name": "John Doe",
"age": 30,
"email": "test1@test.com",
}
}
def get_user_data(id: UUID) -> dict:
id = str(id)
if id not in fake_data.keys():
raise HTTPException(status_code=404, detail="User not found")
return fake_data[id]
我們使用假資料來實作一下資料驗證的功能,可以看到我們在 get_user_data 中要求要輸入一個 id 型態是 UUID,如果字典中有這個 id 便會回傳資料,沒有的話便會回傳一個 404 的狀態給前端。
可以看到注入此方法後,路徑變成需要輸入一個 uuid 的 id 參數 ,畫面上我使用錯誤的 id 進行請求。
可以如預期中獲得 404 的狀態,完成輸入資料驗證的功能。
輸入正確id可獲得字典內資訊。
依賴注入還有更多種用法,在此便不一一介紹,例如依賴注入呼叫的方法也可以使用依賴注入獲取另一個方法的執行結果,實現多層依賴。之後實作練習專案時,也會使用到依賴注入的方式來獲取資料庫連接。官方文件中可以找到更多的依賴注入範例,想更深層運用的同學們可以去閱讀看看。